/**
 * pharma-tools - 23 juin 2011 guillaume
 */
package org.bspv.pharma.tools.trace;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.JoinPoint.StaticPart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * Aspect pour la trace des appels des méthodes.
 * 
 * @author guillaume
 * 
 */
@Service(value = "traceAspect")
public class TraceAspect {

    /**
     * Logger.
     */
    private final static Logger LOGGER = LoggerFactory.getLogger(TraceAspect.class);

    /**
     * Cette méthode est appelée à chaque fois (et avant) qu'une méthode est interceptée.
     * 
     * @param joinPoint
     *            JointPoint
     */
    public void logMethodEntry(JoinPoint joinPoint) {
        // Vérification de l'activation du logger
        if (LOGGER.isDebugEnabled()) {
            Object[] args = joinPoint.getArgs();
            // Nom de la méthode interceptée
            String name = joinPoint.getSignature().toLongString();
            StringBuilder sb = new StringBuilder();
            sb.append("###");
            sb.append(name);
            sb.append(" called with: [");
            // Liste des valeurs des arguments reçus par la méthode
            for (int i = 0; i < args.length; i++) {
                Object o = args[i];
                sb.append("'");
                sb.append(o);
                sb.append("'");
                sb.append((i == args.length - 1) ? "" : ", ");
            }
            sb.append("]");
            LOGGER.debug(sb.toString());
        }
    }

    /**
     * Cette méthode est appelée à chaque fois (et après) qu'une méthode est interceptée. Elle
     * reçoit en argument 'result' qui est le retour de la méthode interceptée
     * 
     * @param staticPart Partie statique
     * @param result Objet résultat de la méthode
     */
    public void logMethodExit(StaticPart staticPart, Object result) {
        // Vérification de l'activation du logger
        if (LOGGER.isDebugEnabled()) {
            // Nom de la méthode interceptée
            String name = staticPart.getSignature().toLongString();
            StringBuilder sb = new StringBuilder();
            sb.append("###");
            sb.append(name);
            sb.append(" returning: [");
            sb.append(result);
            sb.append("]");
            LOGGER.debug(sb.toString());
        }
    }

}
